package com.itheima.day16.task;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Properties;

/*分析以下需求,并用代码实现

        1.定义一个Person类
        2.定义 姓名 和 年龄 两个成员变量,生成构造方法和对应的set get方法
        3.在该类中定义一个run()方法,打印:"我"+name+"是一个好人"
        4.在该类中定义一个show(Date date)方法,该方法执行时可以将时间转为符合我们阅读习惯的格式
        如:2019年01月08日 11:00:30

        5.在该类中定义一个copy(String fileName)方法,该方法可以接收一个文件的名称
        注意:在模块的根路径下已知有一个纯文本文档类型的文件,需要在该方法的内部
        将文件里的内容反转
        例如:
        源文件内容:
        种一颗树最好的时光是十年前
        其次好的时光就是现在

        方法执行之后文件里的内容
        其次好的时光就是现在
        种一颗树最好的时光是十年前

        6.在测试类中,通过反射的方式创建对象、获取方法、执行方法
*/
public class Demo1 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException, ClassNotFoundException, InstantiationException, NoSuchFieldException {
        //获得类加载器
        ClassLoader classLoader = Demo1.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
        Properties p=new Properties();
        p.load(resourceAsStream);
        resourceAsStream.close();

        String className = p.getProperty("className");

        Class<?> aClass = Class.forName(className);
        //获取空参构造
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
//        Constructor<?> declaredConstructor1 = aClass.getDeclaredConstructor(String.class, int.class);
//        Object xiaoqiang = declaredConstructor1.newInstance("xiaoqiang", 23);
        declaredConstructor.setAccessible(true);
        Object o = declaredConstructor.newInstance();

        Field filedName = aClass.getDeclaredField(p.getProperty("filedName"));
        filedName.setAccessible(true);
        filedName.set(o, "小强");

        Method methodName = aClass.getDeclaredMethod(p.getProperty("methodName1"));
        methodName.setAccessible(true);
        Object invoke1 = methodName.invoke(o);

        Date date=new Date();
        Method methodName2 = aClass.getDeclaredMethod(p.getProperty("methodName3"),Date.class);
        methodName2.setAccessible(true);
        Object invoke2 = methodName2.invoke(o,date);

        Method methodName3 = aClass.getDeclaredMethod(p.getProperty("methodName2"),String.class);
        methodName3.setAccessible(true);
        Object invoke3 = methodName3.invoke(o,"zuoye\\a.txt");



    }

}
